package fr.bludwarf.skywarrior.utils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import fr.bludwarf.skywarrior.global.ElementNomme;

public class Reflect<T extends ElementNomme>
{
	
	/** class.getName -> Liste des champs déclarés */
	private Map<String, T> FIELDS = null;
	private Class<T> _clazz;
	
	public Reflect(final Class<T> clazz)
	{
		_clazz = clazz;
	}
	
	public T getDeclaredField(final String name)
	{		
		if (FIELDS == null)
		{
			FIELDS = new HashMap<String, T>();
			for (final Field field : _clazz.getDeclaredFields())
			{
				if (field.getType() == _clazz)
				{
					try
					{
						final T techno = (T) field.get(_clazz);
						FIELDS.put(techno.getNom(), techno);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			}
		}
		
		if (!FIELDS.containsKey(name))
			throw new RuntimeException(String.format("Le(la) %2$s nommé(e) \"%1$s\" n'a pas été déclaré(e) dans le code", name, _clazz.getSimpleName()));
		
		return FIELDS.get(name);
	}
}
